home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / source / src / arith / irad.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  3.4 KB  |  129 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  irad.c
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #include <LEDA/impl/iint.h>
  16. #include <LEDA/impl/iloc.h>
  17.  
  18. EXTERN_FUNCTION(void radaddto, (PLACE *a, PLACE *b, PLACE *carry));
  19.         /* a=a+b+carry, Uebertrag in carry */
  20. EXTERN_FUNCTION(void radsubto, (PLACE *a, PLACE *b, PLACE *carry));
  21.         /* a=a-b-carry, Uebertrag in carry */
  22. EXTERN_FUNCTION(void radmul, (PLACE *a, PLACE *b, PLACE *m, PLACE *carry));
  23.         /* m=m+a*b+carry, Uebertrag in carry */
  24. EXTERN_FUNCTION(void raddiv, (PLACE *h, PLACE *l, PLACE *n, PLACE *q));
  25.         /* h*RADIX+l / n ergibt Quotient q und Rest h */
  26.  
  27.  
  28. #ifndef ATARI
  29. void radaddto(a, b, carry)
  30.         PLACE *a, *b, *carry;
  31.         /* Addiere *b und *carry zu *a, Uebertrag in *carry */
  32. {       register DOUBLEPLACE accu = 0;
  33.         accu = *a;
  34.         accu += *b;
  35.         accu += *carry;
  36.         *a = accu;
  37.         /* *carry = accu >> LOGPLACE; */
  38.         *carry = 0;
  39. }
  40. #endif
  41.  
  42. void radsubto(a, b, carry)
  43.         PLACE *a, *b, *carry;
  44.         /* Subtrahiere *b und *carry von *a, Uebertrag in *carry
  45.               und zwar 0 oder 1                 */
  46. {       register DOUBLEPLACE accu = 0;
  47.         accu = *a;
  48.         accu -= *b;
  49.         accu -= *carry;
  50.         *a = accu;
  51.         /* accu >>= LOGPLACE; */
  52.         accu  &= 1;
  53.         *carry = accu;
  54. }
  55.  
  56. #ifndef __PARC__
  57. #ifndef ATARI
  58. void radmul(a, b, m, carry)
  59.         PLACE *a, *b, *m, *carry;
  60.         /* Multipliziere und addiere:
  61.               accu   = *a * *b + *m + *carry;
  62.               *m     = accu % RADIX;
  63.               *carry = accu / RADIX;    */
  64. {       register DOUBLEPLACE accu = 0;
  65.         accu = *a;
  66.         accu *= *b;
  67.         accu += *m;
  68.         accu += *carry;
  69.         *m = accu;
  70.         /* *carry = accu >> LOGPLACE; */
  71.         *carry = 0;
  72. }
  73. #endif
  74. #endif
  75.  
  76. #ifndef __PARC__
  77. #ifndef ATARI
  78. void raddiv(h, l, n, q)
  79.         PLACE *h, *l, *n, *q;
  80.         /* Division mit Rest
  81.               (*h)*RADIX + (*l) == (*n)*(*q) + (*r)
  82.               Voraussetzung:     *h < *n                */
  83. {       register DOUBLEPLACE accu = 0;
  84.         accu = *h; 
  85.         /* accu <<= LOGPLACE; */
  86.         accu += *l;
  87.         *q = accu / *n;
  88.         *h = accu % *n;
  89. }
  90. #endif
  91. #endif
  92.  
  93. /************************************************************/
  94.  
  95. #ifdef USE_PLACE_RAD
  96.  
  97. void radaddto(a, b, carry)
  98.         PLACE *a, *b, *carry;
  99.         /* Addiere *b und *carry zu *a, Uebertrag in *carry */
  100. {       *carry=PLACEadd(*a, *b, *carry, a);
  101. }
  102.  
  103. void radsubto(a, b, carry)
  104.         PLACE *a, *b, *carry;
  105.         /* Subtrahiere *b und *carry von *a, Uebertrag in *carry
  106.               und zwar 0 oder 1                 */
  107. {       *carry=PLACEsub(*a, *b, *carry, a);
  108. }
  109.  
  110. void radmul(a, b, m, carry)
  111.         PLACE *a, *b, *m, *carry;
  112.         /* Multipliziere und addiere:
  113.               accu   = *a * *b + *m + *carry;
  114.               *m     = accu % RADIX;
  115.               *carry = accu / RADIX;    */
  116. {       *carry=PLACEmuladd(*a, *b, *carry, m);
  117. }
  118.  
  119. void raddiv(h, l, n, q)
  120.         PLACE *h, *l, *n, *q;
  121.         /* Division mit Rest
  122.               (*h)*RADIX + (*l) == (*n)*(*q) + (*r)
  123.               Voraussetzung:     *h < *n                */
  124. {       *h=PLACEdiv(*h, *l, *n, q);
  125. }
  126.  
  127. #endif
  128.